Skip to content

ES6 中 Reflect 对象,它什么优点

  • 有点:优雅、语义化易读、错误处理

  • 它是对 Object 一些明显内部的方法(defineProperty), 放到 Reflect 对象上,

  • object 在使用的时候,不抛错,Reflect 是返回 true fasle

js
//老写法
try {
  Object.defineProperty(target, property, attributes);
  //successs
} catch (e) {
  //failure
}
//新写法
if (Reflect.defineProperty(target, property, attributes)) {
  //success
} else {
  //failure
}
  • Reflect 更加语义化 get set has, 容易读
js
//老写法
Function.prototype.apply.call(Math.floor, undefined, [1.75]); //1
//新写法
Reflect.apply(Math.floor, undefined, [1.75]); //1

let obj = {
  label: "A",
  value: 20,
};
Reflect.deleteProperty(obj, "value");
console.log(obj); // [object Object] { label: "A" }
Reflect.has(obj, "label"); // true
console.log(Reflect.get(obj, "label")); // 'A'
  • proxy
js
var cat = {
  name: "cat",
};
var loggedObj = new Proxy(cat, {
  get: function (target, name) {
    console.log("get" + name);
    return Reflect.get(target, name);
  },
  set: function (target, name) {
    console.log("set" + name);
    Reflect.set(target, name);
  },
  has: function (target, name) {
    console.log("has" + name);
    return Reflect.has(target, name);
  },
});

console.log((loggedObj["value"] = "123"));

receiver

receiver的作用是 如果我们的源对象(obj)有setter,getter的访问器属性,那么可以通过receiver来改变里面的this

js
const obj = {
  _name: 'xwl',
  get name() {
    //相当于objProxy._name,再一次通过Proxy创建的代理
    return this._name
  },
  set name(newValue) {
    this._name = newValue
  }
}

const objProxy = new Proxy(obj, {
  // receiver是创建出来的代理对象
  get(target, key, receiver) {
    console.log('get的操作触发了')
    return Reflect.get(target, key, receiver)
  },
  set(target, key, newValue, receiver) {
    console.log('set的操作触发了')
    Reflect.set(target, key, newValue, receiver)
  }
})
// objProxy.name = 'xxx'
console.log(objProxy.name)

在 MIT 许可下发布